package com.easemob.tsdb.thrift.rpc.service; import com.easemob.tsdb.thrift.models.ThriftTsdbRpcService; import com.easemob.tsdb.thrift.rpc.Constants; import com.easemob.tsdb.utils.ConfigUtils; import com.thinkaurelius.thrift.Message; import com.thinkaurelius.thrift.TDisruptorServer; import com.thinkaurelius.thrift.util.TBinaryProtocol; import org.apache.thrift.TProcessorFactory; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TNonblockingServerSocket; import org.apache.thrift.transport.TTransportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetSocketAddress; import java.util.Map; /** * @author stliu <stliu@apache.org> * @date 3/11/15 */ public class ThriftServerFactory implements Constants { private static final Logger logger = LoggerFactory.getLogger(ThriftServerFactory.class); private final String thriftHost; private final int thriftPort; private final int workers; private final int acceptors; private final int selectors; private final TProcessorFactory processorFactory; private final InetSocketAddress address; private final TNonblockingServerSocket socket; public ThriftServerFactory(TSDBDelegate tsdb) throws TTransportException { Map<String, String> map = tsdb.getConfig().getMap(); this.thriftHost = map.getOrDefault(PLUGIN_THRIFT_HOST, PLUGIN_THRIFT_HOST_DEFAULT); this.thriftPort = ConfigUtils.getIntValue(map, PLUGIN_THRIFT_PORT, PLUGIN_THRIFT_PORT_DEFAULT); this.address = new InetSocketAddress(thriftHost, thriftPort); this.socket = new TNonblockingServerSocket(address); logger.info("Thrift RPC Server is running on {}:{}", thriftHost, thriftPort); this.workers = ConfigUtils.getIntValue(map, PLUGIN_THRIFT_WORKERS, PLUGIN_THRIFT_WORKERS_DEFAULT); this.acceptors = ConfigUtils.getIntValue(map, PLUGIN_THRIFT_DISRUPTOR_ACCEPTORS, PLUGIN_THRIFT_DISRUPTOR_ACCEPTORS_DEFAULT); this.selectors = ConfigUtils.getIntValue(map, PLUGIN_THRIFT_DISRUPTOR_SELECTORS, PLUGIN_THRIFT_DISRUPTOR_SELECTORS_DEFAULT); this.processorFactory = new TProcessorFactory(new ThriftTsdbRpcService.Processor<>(new ThriftMetricsService(tsdb))); } public CustomTDisruptorServer disruptorServerProvider() throws TTransportException { final TBinaryProtocol.Factory protocol = new TBinaryProtocol.Factory(); TDisruptorServer.Args args = new TDisruptorServer.Args(socket) .inputTransportFactory(new TFramedTransport.Factory()) .outputTransportFactory(new TFramedTransport.Factory()) .inputProtocolFactory(protocol) .outputProtocolFactory(protocol) .processorFactory(processorFactory) .useHeapBasedAllocation(true) .numAcceptors(acceptors) .numSelectors(selectors) .numWorkersPerSelector(workers) .alwaysReallocateBuffers(true); return new CustomTDisruptorServer(args); } public static class CustomTDisruptorServer extends TDisruptorServer { public CustomTDisruptorServer(Args args) { super(args); } @Override protected void beforeInvoke(Message message) { } } }